EC2 内の Docker コンテナで IAM ロール認証情報を利用する方法を教えてください
困っていた内容
EC2 インスタンスに IAM ロールをアタッチし、インスタンスプロファイル認証情報を利用していますが、EC2 内にインストールした Docker 上のコンテナアプリケーションからも IAM ロールの認証情報を利用したい要件があります。実現する方法を教えてください。
どう対応すればいいの?
対象 EC2 インスタンスの HttpPutResponseHopLimit
という属性を変更することで、EC2 内の Docker コンテナ上からも IAM ロールの認証情報を取得できるようになります。
まずは対象インスタンスに対して ec2 describe-instances
コマンドを実行し、現在の設定を確認します。
初期状態では HttpPutResponseHopLimit
が 1 になっているはずです。
コマンド例
$ aws ec2 describe-instances --instance-id [インスタンスID] --region [リージョン名] --query "Reservations[*].Instances[*].MetadataOptions" [ [ { "State": "applied", "HttpEndpoint": "enabled", "HttpTokens": "optional", "HttpPutResponseHopLimit": 1 } ] ]
そこで、 ec2 modify-instance-metadata-options
コマンドで HttpPutResponseHopLimit
の値を 2 に変更します。
コマンド例
$ aws ec2 modify-instance-metadata-options --instance-id [インスタンスID] --region [リージョン名] --http-put-response-hop-limit 2 --http-endpoint enabled { "InstanceId": "i-xxxxxxxxxx", "InstanceMetadataOptions": { "State": "pending", "HttpEndpoint": "enabled", "HttpTokens": "optional", "HttpPutResponseHopLimit": 2 } }
以上の設定で、EC2 上の Docker コンテナからも IAM ロールの認証情報を利用できるようになります。
やってみた
実際に検証してみました。実施した内容は以下の通りです。
- Amazon Linux 2 の EC2 インスタンスを起動し、EC2 の操作権限が付与された IAM ロールをアタッチする。
- EC2 内で IAM ロールの認証情報が取得できていることを確認し
HttpPutResponseHopLimit
の設定を変更する。 - EC2 内にインストールした Docker 上で Amazon Linux 2 のコンテナを起動し、コンテナ内の OS でも IAM ロールの認証情報が取得できていることを確認する。
まずは Amazon Linux 2 の EC2 インスタンスを起動し AmazonEC2FullAcccess
のポリシーが付与された IAM ロールをアタッチします。
IAM ロール名は "test-ec2-role" とします。
対象 EC2 インスタンスに SSH 接続し aws sts get-caller-identity
コマンドを実行します。
アタッチした IAM ロール が認証情報として使用されているのを確認します。
続いて先述の aws ec2 modify-instance-metadata-options
コマンドを EC2 インスタンス自身に対して実行し HttpPutResponseHopLimit
の値を 2 に設定します。
$ aws ec2 modify-instance-metadata-options --instance-id [インスタンスID] --region [リージョン名] --http-put-response-hop-limit 2 --http-endpoint enabled { "InstanceId": "i-xxxxxxxxxx", "InstanceMetadataOptions": { "State": "pending", "HttpEndpoint": "enabled", "HttpTokens": "optional", "HttpPutResponseHopLimit": 2 } }
ここまでできたら、次は EC2 に Docker をインストールします。
ここでは説明を省略しますが、筆者は文末の参考資料[1]を参考にしました。
Docker をインストールできたら、Amazon Linux 2 のコンテナを起動し、コンテナ内で AWS CLI のインストールを実行します。 (EC2 側の Amazon Linux 2 には AWS CLI が最初から入っていますが、Docker コンテナで起動した Amazon Linux 2 には AWS CLI が入っていないため、インストールが必要になります)
(EC2 内で実行) Docker コンテナ起動
$ docker run -it amazonlinux:2
(Dockerコンテナ内で実行) AWS CLI のインストールとバージョン確認
$ yum install unzip less $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ unzip awscliv2.zip $ ./aws/install $ aws --version
コンテナ内で AWS CLI をインストールできたら、今度はコンテナ内で aws sts get-caller-identity
コマンドを実行します。
先ほど EC2 側で確認したのと同じ IAM ロール認証情報が表示されていれば、コンテナ内でも IAM ロールの認証情報が使用できる状態になっています。
aws ec2 describe-instances
などの CLI コマンドが実行できることも確認してみましょう。
以上、EC2 内の Docker コンテナ上で IAM ロール認証情報を使用するまでの手順をご紹介しました。
この情報がどなたかのお役に立てば幸いです!
参考資料
- [1] AWS EC2上にDockerをインストールし簡単なWebアプリを起動する
- [2] Docker 公式イメージで手軽に Amazon Linux AMI や Amazon Linux 2 の検証環境をローカルマシンへ手に入れる | DevelopersIO
- [3] AWS CLI の最新バージョンを使用してインストールまたは更新を行う - AWS Command Line Interface
- [4] PUT レスポンスホップリミットを変更する - Amazon Elastic Compute Cloud
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。